#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QGraphicsView>
#include <QGraphicsEllipseItem>
#include <QGraphicsScene>

#include <QSerialPort>
#include <QSerialPortInfo>

#include <QPushButton>
#include <QLineEdit>
#include <QMessageBox>
#include <QQueue>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

enum BurnState {
    StateIdle,
    StateEnterFactory,
    StateSnSet,
    StateSnGet,
    StateMacRead,
    StateExitFactory
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    //更新串口连接状态的方法
    void setConnected();
    void setDisconnected();

    // 启动自动连接的方法
    void autoConnectSerialPort();

private slots:
    void onSerialPortDataReceived();
    void onSerialPortDisconnected();

    void handleSNInput();  // 处理扫码枪输入
    void startBurning();   // 开始烧录逻辑

private:
    int snCounter = 1; // SN 编号计数器，从 1 开始
    QString snFileLog; // 保存已烧录的sn号
    QString logFile;
    QMessageBox *successMessageBox; // 用于管理烧录成功的弹框
    QMessageBox *errorMessageBox;
    bool isConnected = false;
    QString readSnData; // 用于存储解析到的 SN 数据
    QString macAddress;
    QString writeError;

    Ui::MainWindow *ui;
    QGraphicsView *statusView;           // 显示连接状态的图形视图
    QGraphicsScene *scene;               // 视图的 Scene
    QGraphicsEllipseItem *statusLight;   // 状态指示灯的圆形项目

    QSerialPort *serialPort;             // Serial port object
    BurnState burnState;
    QQueue<QString> commandQueue;

    void updateProgressBar(int value);   // 更新进度条
    bool validateSN(const QString &sn); // 校验 SN 格式
    static void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg);
    QString getYearChar(int year);
    void sendNextCommand();
    void compareSn();
    void handleFailure(const QString &errorMessage);

};
#endif // MAINWINDOW_H
